package com.yangit.temp.common.util.string;

import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateUtil {
	
	/**
	 * -获取系统嘀嗒数
	 * @return Long类型 ticks
	 */
	public static long getTicks() {
		long milli = System.currentTimeMillis() + 8*3600*1000;
		long ticks = (milli*10000)+621355968000000000L;
		return ticks;
	}
	/**
	 * -时间戳转换成日期格式字符串
	 * 
	 * @param seconds   精确到分钟的字符串
	 * @param format
	 * @return
	 */
	public static String timeStamp2Date(String seconds, String format) {
		if (seconds == null || seconds.isEmpty() || seconds.equals("null")) {
			return "";
		}
		if (format == null || format.isEmpty()) {
			format = format;
		}
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		return sdf.format(new Date(Long.valueOf(seconds + "000")));
	}

	/**
	 * -日期格式字符串转换成时间戳
	 * 
	 * @param date_str   字符串日期
	 * @param format 如：yyyy-MM-dd HH:mm:ss
	 * @return
	 */
	public static String date2TimeStamp(String date_str, String format) {
		try {
			SimpleDateFormat sdf = new SimpleDateFormat(format);
			return String.valueOf(sdf.parse(date_str).getTime() / 1000);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}

	/**
	 * -取得当前时间戳（精确到秒）
	 * 
	 * @return
	 */
	public static String timeStamp() {
		long time = System.currentTimeMillis();
		String t = String.valueOf(time / 1000);
		return t;
	}

	/**
	 *
	 * @return yyyyMMddHHmmss
	 */
	public static String getCurrentTime() {
		String currentDate = "";
		Date date = new Date();
		SimpleDateFormat smpdf = new SimpleDateFormat("yyyyMMddHHmmss");
		currentDate = smpdf.format(date);
		return currentDate;
	}
	/**
	 *
	 * @return dfm 格式的字符串
	 */
	public static String getDateStr(String date,String dfm) {
		String currentDate = "";
		SimpleDateFormat smpdf = new SimpleDateFormat(dfm);
		currentDate = smpdf.format(date);
		return currentDate;
	}

	/**
	 *
	 * @return yyyy-MM-dd HH:mm:ss
	 */
	public static String getEasyTime() {
		String currentDate = "";
		Date date = new Date();
		SimpleDateFormat smpdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		currentDate = smpdf.format(date);
		return currentDate;
	}

	/**
	 *
	 * @return yyyyMMdd
	 */
	public static String getCurrentDate() {
		String currentDate = "";
		Date date = new Date();
		SimpleDateFormat smpdf = new SimpleDateFormat("yyyyMMdd");
		currentDate = smpdf.format(date);
		return currentDate;
	}

	/**
	 *
	 * @return yyyy-MM-dd
	 */
	public static String getEasyDate() {
		String currentDate = "";
		Date date = new Date();
		SimpleDateFormat smpdf = new SimpleDateFormat("yyyy-MM-dd");
		currentDate = smpdf.format(date);
		return currentDate;
	}

	/**
	 *
	 * @param str 指定日期格式
	 * @return 指定日期格式的字符串
	 */
	public static String getDateTime(String str) {
		String currentDate = "";
		Date date = new Date();
		SimpleDateFormat smpdf = new SimpleDateFormat(str);
		currentDate = smpdf.format(date);
		return currentDate;
	}

	/**
	 * 说明 ：计算一个与指定日期 相差指定天数 的 日期字符串
	 * 
	 * @param dateStr 日期类型的字符串 如：20180228
	 * @param days    需要相隔天数 如：1
	 * @return Str 指定日期的字符串 如：20180501
	 */
	public static String getAppointDate(String dateStr, int days) {
		String appointDate = "";
		// 时间表示格式可以改变，yyyyMMdd需要写例如20160523这种形式的时间
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		// String datestr = "20180228";
		// 将字符串的日期转为Date类型，ParsePosition(0)表示从第一个字符开始解析
		Date date = sdf.parse(dateStr, new ParsePosition(0));
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		// add方法中的第二个参数n中，正数表示该日期后n天，负数表示该日期的前n天
		calendar.add(Calendar.DATE, days);
		Date date1 = calendar.getTime();
		appointDate = sdf.format(date1);
		return appointDate;
	}

	/**
	 * 说明 ：计算一个与指定日期 相差指定分钟数 的 日期字符串
	 * 
	 * @param dateStr 日期类型的字符串 如：2018/02/28 10:45:25
	 * @param mins    需要相隔分钟数 如：1
	 * @return Str 指定日期的字符串 如：2018/02/28 10:46:25
	 */
	public static String getAppointTimeByMinute(String dateStr, int mins) {
		String appointTime = "";
		// 时间表示格式可以改变，yyyyMMdd需要写例如20160523这种形式的时间
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// 将字符串的日期转为Date类型，ParsePosition(0)表示从第一个字符开始解析
		Date date = sdf.parse(dateStr, new ParsePosition(0));
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		// add方法中的第二个参数n中，正数表示该日期后分钟，负数表示该日期的前n分钟
		calendar.add(Calendar.MINUTE, mins);
		Date dateRes = calendar.getTime();
		appointTime = sdf.format(dateRes);
		return appointTime;
	}

	/**
	 * 说明 ：计算一个与指定日期 相差指定秒数 的 日期字符串
	 * 
	 * @param dateStr 日期类型的字符串 如：2018/02/28 10:45:25
	 * @param seconds 需要相隔秒数 如：1
	 * @return Str 指定日期的字符串 如：2018/02/28 10:46:25
	 */
	public static String getAppointTimeBySecound(String dateStr, int seconds) {
		String appointTime = "";
		// 时间表示格式可以改变，yyyyMMdd需要写例如20160523这种形式的时间
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// 将字符串的日期转为Date类型，ParsePosition(0)表示从第一个字符开始解析
		Date date = sdf.parse(dateStr, new ParsePosition(0));
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		// add方法中的第二个参数n中，正数表示该日期后分钟，负数表示该日期的前n分钟
		calendar.add(Calendar.SECOND, seconds);
		Date dateRes = calendar.getTime();
		appointTime = sdf.format(dateRes);
		return appointTime;
	}

	/**
	 * 通过时间毫秒数判断两个时间间隔 相差天数
	 * 
	 * @param startDateStr 日期类型字符串 小日期
	 * @param endDateStr   日期类型字符串 大日期
	 * @param smt          日期格式
	 * @return int d1-d0 相差天数
	 */
	public static int differentDaysByMillisecond(String startDateStr, String endDateStr, String smt) {
		SimpleDateFormat format = new SimpleDateFormat(smt);

		Date endDate = null;
		Date startDate = null;
		try {
			endDate = format.parse(endDateStr);
			startDate = format.parse(startDateStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}

		int days = (int) ((endDate.getTime() - startDate.getTime()) / (1000 * 3600 * 24));
		return days;
	}


	/**
	 * 通过时间毫秒数判断两个时间间隔 相差分钟数
	 *
	 * @param startDateStr 日期类型字符串 小日期
	 * @param endDateStr   日期类型字符串 大日期
	 * @param smt          日期格式
	 * @return int d1-d0 相差天数
	 */
	public static int differentMinusByMillisecond(String startDateStr, String endDateStr, String smt) {
		SimpleDateFormat format = new SimpleDateFormat(smt);

		Date endDate = null;
		Date startDate = null;
		try {
			endDate = format.parse(endDateStr);
			startDate = format.parse(startDateStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}

		int minutes = (int) ((endDate.getTime() - startDate.getTime()) / (1000 * 60 ));
		return minutes;
	}

	/**
	 * 获取服务器启动时间
	 */
	public static Date getServerStartDate() {
		long time = ManagementFactory.getRuntimeMXBean().getStartTime();
		return new Date(time);
	}

	/**
	 * 计算两个时间差
	 *
	 * @param startDate
	 * @param endDate
	 * @return 两个日期之间相差的毫秒数
	 */
	public static String getDatePoor(Date startDate, Date endDate) {
		long nd = 1000 * 24 * 60 * 60;
		long nh = 1000 * 60 * 60;
		long nm = 1000 * 60;
		// long ns = 1000;
		// 获得两个时间的毫秒时间差异
		long diff = endDate.getTime() - startDate.getTime();
		// 计算差多少天
		long day = diff / nd;
		// 计算差多少小时
		long hour = diff % nd / nh;
		// 计算差多少分钟
		long min = diff % nd % nh / nm;
		// 计算差多少秒//输出结果
		// long sec = diff % nd % nh % nm / ns;
		return day + "天" + hour + "小时" + min + "分钟";
	}


	public static void main(String[] args) {
		String timeStamp = timeStamp();
		System.out.println("timeStamp=" + timeStamp); // 运行输出:timeStamp=1470278082
		System.out.println(System.currentTimeMillis());// 运行输出:1470278082980
		// 该方法的作用是返回当前的计算机时间，时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数

		String date = timeStamp2Date(timeStamp, "yyyy-MM-dd HH:mm:ss");
		System.out.println("date=" + date);// 运行输出:date=2016-08-04 10:34:42

		String timeStamp2 = date2TimeStamp(date, "yyyy-MM-dd HH:mm:ss");
		System.out.println(timeStamp2); // 运行输出:1470278082

		int sste = differentMinusByMillisecond("2020-11-09 15:02:35","2020-11-09 13:52:57","yyyy-MM-dd HH:mm:ss");
		System.out.println(sste);
	}

}